#ifndef PAGEPOSITIONSYSTEM_H
#define PAGEPOSITIONSYSTEM_H

#include <QPointF>
#include <QRectF>
#include <QString>
#include <QDebug>

/**
 * 统一的页码位置系统
 *
 * 这是整个应用程序中页码位置的单一真相来源。
 * 所有组件都应该使用这个枚举和工具方法。
 *
 * 设计原则：
 * - 单一职责：只负责位置相关的计算和显示
 * - 无状态：所有方法都是静态的，不存储状态
 * - 简单直接：消除复杂的适配器和转换逻辑
 * - 物理对应：位置定义直接对应实际打印位置
 */
class PagePositionSystem
{
public:
    /**
     * 页码位置枚举
     *
     * 这些位置直接对应物理打印位置，确保WYSIWYG体验。
     * 枚举值按照常见的阅读顺序排列：从上到下，从左到右。
     */
    enum class Position {
        TopLeft = 0,      // 顶部左侧
        TopCenter = 1,    // 顶部居中
        TopRight = 2,     // 顶部右侧
        BottomLeft = 3,   // 底部左侧
        BottomCenter = 4, // 底部居中 [最常用]
        BottomRight = 5,  // 底部右侧
        Custom = 6        // 自定义位置
    };

    // 物理常量定义 - 消除Magic Number
    struct PhysicalConstants {
        static constexpr double DEFAULT_MARGIN_MM = 15.0;     // 默认页边距(毫米)
        static constexpr double TOP_MARGIN_MM = 20.0;         // 顶部边距(毫米)
        static constexpr double BOTTOM_MARGIN_MM = 20.0;      // 底部边距(毫米)
        static constexpr double SIDE_MARGIN_MM = 15.0;        // 侧面边距(毫米)

        // DPI转换相关常量
        static constexpr double MM_PER_INCH = 25.4;           // 毫米到英寸转换
        static constexpr double DEFAULT_DPI = 300.0;          // 默认DPI
    };

    /**
     * 计算页码在页面中的精确位置
     *
     * @param pageRect 页面矩形区域（单位：毫米）
     * @param position 页码位置枚举
     * @param customOffset 用户自定义偏移（单位：毫米）
     * @return 页码左上角坐标（单位：毫米）
     */
    static QPointF calculatePosition(const QRectF& pageRect, Position position,
                                   const QPointF& customOffset = QPointF(0, 0));

    /**
     * 根据位置计算文本对齐方式
     *
     * @param position 页码位置
     * @param textSize 文本尺寸
     * @param basePosition 基础位置坐标
     * @return 调整后的文本原点坐标
     */
    static QPointF calculateTextOrigin(const QPointF& basePosition,
                                     const QSizeF& textSize, Position position);

    /**
     * 获取位置的显示名称
     *
     * @param position 页码位置
     * @return 位置的中文名称
     */
    static QString getDisplayName(Position position);

    /**
     * 检查位置是否为有效值
     *
     * @param position 待检查的位置
     * @return 是否有效
     */
    static bool isValidPosition(Position position);

    /**
     * 获取所有预定义位置的列表（不包括Custom）
     *
     * @return 预定义位置列表
     */
    static QList<Position> getPresetPositions();

    /**
     * 将毫米转换为像素
     *
     * @param mm 毫米值
     * @param dpi DPI设置
     * @return 像素值
     */
    static double mmToPixels(double mm, double dpi = PhysicalConstants::DEFAULT_DPI);

    /**
     * 将像素转换为毫米
     *
     * @param pixels 像素值
     * @param dpi DPI设置
     * @return 毫米值
     */
    static double pixelsToMm(double pixels, double dpi = PhysicalConstants::DEFAULT_DPI);

    /**
     * 获取默认位置
     *
     * @return 默认的页码位置（底部居中）
     */
    static Position getDefaultPosition();

private:
    // 私有工具方法，实现具体的计算逻辑
    static QPointF calculateTopPosition(const QRectF& pageRect, const QPointF& offset);
    static QPointF calculateBottomPosition(const QRectF& pageRect, const QPointF& offset);
    static QPointF calculateLeftPosition(const QRectF& pageRect, const QPointF& offset);
    static QPointF calculateRightPosition(const QRectF& pageRect, const QPointF& offset);
    static QPointF calculateCenterPosition(const QRectF& pageRect);
};

/**
 * QDebug支持 - 便于调试输出
 */
inline QDebug operator<<(QDebug debug, PagePositionSystem::Position position)
{
    debug.nospace() << "PagePosition::" << PagePositionSystem::getDisplayName(position);
    return debug.space();
}

#endif // PAGEPOSITIONSYSTEM_H